package project02.cool;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.slim3.util.BeanUtil;

import project02.dao.DateDataDao;
import project02.dao.MessageDataDao;
import project02.dao.UserInfoDao;
import project02.model.DateData;
import project02.model.MessageData;
import project02.model.UserInfo;

public class Util {

    private DateDataDao dao = new DateDataDao();
    private UserInfoDao userDao = new UserInfoDao();
    private Helper helper = Helper.getInstance();


    private static final Util instance = new Util();

    private Util() {}

    public static Util getInstance() {
        return instance;
    }

    /**
     * 出勤登録前の整合性チェックをおこなう
     *
     */
    public boolean chkGtw(String userId, Calendar cal) {

        boolean result = true;
        dao = new DateDataDao();
        List<DateData> list = dao.findAllByUser(userId);
        if (list.size() == 0) {
            return true;
        }
        for (DateData entity : list) {
            if ((userId + helper.getYYMMDDHH(cal)).equals(entity.getDataId())) {
                result = false;
                break;
            }
        }

        return result;
    }

    /**
     * 退勤登録前に出勤記録の有無を確認し、ある場合は取得する.
     * @throws Exception
     */
    public DateData chkGh(String userId, Calendar cal) throws Exception {

        DateData result = new DateData();
        List<DateData> list = new ArrayList<DateData>();
        dao = new DateDataDao();
        try {
            list = dao.findAllByUser(userId);
        } catch (Exception e) {
            throw e;
        }

        // エンティティが1件もないので、未出勤
        if (list.size() == 0) {
            return result;
        }

        for (DateData entity : list) {
            if (entity.getGoHome() == null) {
                BeanUtil.copy(entity, result);
                break;
            }
        }

        return result;
    }

    /**
     * 出勤登録を行うメソッド
     * @param userId ユーザID
     * @param cal 現在の日時
     * @return 登録データ
     * @throws Exception
     */
    public DateData setGtw(String userId, Calendar cal) throws Exception {

        DateData result = new DateData();
        DateData entity = new DateData();

        entity.setDataId(userId + helper.getYYMMDDHH(cal));
        entity.setUserId(userId);
        entity.setYear(helper.getYear(cal));
        entity.setMonth(helper.getMonth(cal));
        entity.setDate(helper.getDay(cal));
        entity.setGoToWork(cal.getTime());
        entity.setGtwFlg(Consts.original);
        entity.setGoHome(null);
        entity.setGhFlg(Consts.original);

        try {
            result = dao.makePersistentInTx(entity);
        } catch (Exception e) {
            throw e;
        }

        return result;
    }

    /**
     * 退勤登録を行うメソッド
     * @param gtwData 該当する出勤データ
     * @param cal 現在の日時
     * @return 登録データ
     * @throws Exception
     */
    public DateData setGh(DateData gtwData, Calendar cal) throws Exception {

        DateData result = new DateData();
        DateData entity = new DateData();

        entity.setDataId(gtwData.getDataId());
        entity.setUserId(gtwData.getUserId());
        entity.setYear(gtwData.getYear());
        entity.setMonth(gtwData.getMonth());
        entity.setDate(gtwData.getDate());
        entity.setGoToWork(gtwData.getGoToWork());
        entity.setGtwFlg(gtwData.getGtwFlg());
        entity.setGoHome(cal.getTime());
        entity.setGhFlg(Consts.original);

        try {
            dao.makePersistentInTx(entity);
        } catch (Exception e) {
            throw e;
        }

        return result;
    }

    /**
     * iモードIDよりユーザ情報を取得する
     * @param iModeId 携帯電話個体認証ID
     * @return ユーザ情報
     * @throws Exception
     */
    public UserInfo getUserInfoByImodeId(String iModeId) throws Exception {

        UserInfo user = new UserInfo();
        userDao = new UserInfoDao();
        try {
            user = userDao.findByimodeId(iModeId);
        } catch (Exception e) {
            throw e;
        }
        return user;
    }

    /**
     * ユーザIDの使用チェック(ユーザ登録時)
     * @param inputStr 希望ユーザID
     * @return 使用されているかどうか
     * @throws Exception
     */
    public boolean chkUserId(String inputStr) throws Exception {
        boolean result = true;

        userDao = new UserInfoDao();
        UserInfo userInfo = new UserInfo();

        try {
            userInfo = userDao.findByUserId(inputStr);
        } catch (Exception e) {
            throw e;
        }
        if (userInfo == null) {
            result = false;
        }
        return result;
    }

    /**
     * imodeIDの使用チェック(ユーザ登録時)
     * @param inputStr 接続している携帯端末のimodeID
     * @return 使用されているかどうか
     * @throws Exception
     */
    public boolean chkImodeId(String inputStr) throws Exception {
        boolean result = true;

        userDao = new UserInfoDao();
        UserInfo userInfo = new UserInfo();

        try {
            userInfo = userDao.findByimodeId(inputStr);
        } catch (Exception e) {
            throw e;
        }
        if (userInfo == null) {
            result = false;
        }
        return result;
    }

    /**
     * 手入力修正の対象を確認します.
     * @param startCal 入力された出勤時刻
     * @param endCal 入力された退勤時刻
     * @param dataId 修正元データのID
     * @return 修正対象(0:修正なし 1:退勤時刻のみ修正 2:出勤時刻のみ修正 3:出勤・退勤ともに修正)
     */
    public String chkTargetOfModify(Calendar startCal, Calendar endCal, String dataId) {

        String result = "";

        dao = new DateDataDao();
        DateData entity = new DateData();

        entity = dao.find(dataId);

        Calendar getStartCal = Calendar.getInstance();
        getStartCal.setTime(entity.getGoToWork());
        Calendar getEndCal = Calendar.getInstance();
        getEndCal.setTime(entity.getGoHome());

        boolean jag0 = (getStartCal.get(Calendar.YEAR) == startCal.get(Calendar.YEAR)) && (
                getStartCal.get(Calendar.MONTH) == startCal.get(Calendar.MONTH)) && (
                        getStartCal.get(Calendar.DATE) == startCal.get(Calendar.DATE)) && (
                                getStartCal.get(Calendar.HOUR_OF_DAY) == startCal.get(Calendar.HOUR_OF_DAY)) && (
                                        getStartCal.get(Calendar.MINUTE) == startCal.get(Calendar.MINUTE));

        boolean jag1 = (getEndCal.get(Calendar.YEAR) == endCal.get(Calendar.YEAR)) && (
                getEndCal.get(Calendar.MONTH) == endCal.get(Calendar.MONTH)) && (
                        getEndCal.get(Calendar.DATE) == endCal.get(Calendar.DATE)) && (
                                getEndCal.get(Calendar.HOUR_OF_DAY) == endCal.get(Calendar.HOUR_OF_DAY)) && (
                                        getEndCal.get(Calendar.MINUTE) == endCal.get(Calendar.MINUTE));

        boolean jag2 = Consts.original.equals(entity.getGtwFlg());

        boolean jag3 = Consts.original.equals(entity.getGhFlg());

        if (jag0 && jag1 && jag2 && jag3) {
            result = Consts.noChange;
        } else if (jag0 && !jag1 && jag2) {
            result = Consts.ghOnly;
        } else if (!jag0 && jag1 && jag3) {
            result = Consts.gtwOnly;
        } else {
            result = Consts.bothChange;
        }

        return result;
    }

    /**
     * 新規メッセージ登録前の整合性チェックをおこなう
     *
     */
    public boolean chkMsg(String userId, String messageId) {

        boolean result = true;
        MessageDataDao dao = new MessageDataDao();
        List<MessageData> list = dao.findAllByUser(userId);
        if (list.size() == 0) {
            return true;
        }
        for (MessageData entity : list) {
            if (messageId.equals(entity.getMessageId())) {
                result = false;
                break;
            }
        }

        return result;
    }

    /**
     * 出勤・退勤登録時にメッセージを取得する.
     * @param userId ユーザID
     * @param cal 出勤時の年月日
     * @param worH 出勤退勤区分
     * @return 該当メッセージ
     */
    public String getMessage(String userId, Calendar cal, String worH) {

        String result = "";
        MessageDataDao dao = new MessageDataDao();
        MessageData entity = new MessageData();
        try {
            entity = dao.findByUserYearMonthDateWorH(userId, helper.getYear(cal), helper.getMonth(cal), helper.getDay(cal), worH);
        } catch(Exception e) {
            return null;
        }
        if (entity == null || entity.getMessage() == null) {
            return null;
        }

        result = entity.getMessage();

        return result;
    }

}
